ceph 手动部署

https://blog.csdn.net/for_tech/article/details/77247665

https://blog.csdn.net/for_tech/article/details/77188121

https://blog.csdn.net/signmem/article/details/78565488

所有 Ceph 集群都需要至少一个监视器、且 OSD 数量不小于副本数。自举引导初始监视器是部署 Ceph 存储集群的第一步,监视器的部署也为整个集群奠定了重要框架,如存储池副本数、每个 OSD 拥有的归置组数量、心跳周期、是否需认证等,其中大多数选项都有默认值,但是建设生产集群时仍需要您熟知它们。

按照安装(快速)里的相同配置,我们能配置起监视器为 vm01(后面可以追加监视器vm02,vm03) , OSD 节点为 vm02 、 vm03 的集群。

监视器的自举引导

自举引导监视器(理论上是 Ceph 存储集群)需要以下几个条件:

惟一标识符: fsid 是集群的惟一标识,它是 Ceph 作为文件系统时的文件系统标识符。现在, Ceph 还支持原生接口、块设备、和对象存储网关接口,所以 fsid 有点名不符实了。

集群名称: 每个 Ceph 集群都有自己的名字,它是个不含空格的字符串。默认名字是 ceph 、但你可以更改;尤其是运营着多个集群时,需要用名字来区分要操作哪一个。

比如,当你以联盟架构运营多个集群时,集群名字(如 us-west 、 us-east )将作为标识符出现在 CLI 界面上。注意:要在命令行下指定某个集群,可以指定以集群名为前缀的配置文件(如 ceph.conf 、 us-west.conf 、 us-east.conf 等);也可以参考 CLI 用法( ceph --cluster {cluster-name} )。

监视器名字: 同一集群内的各监视器例程都有惟一的名字,通常都用主机名作为监视器名字(我们建议每台主机只运行一个监视器、并且不要与 OSD 主机复用。短主机名可以用 hostname -s 获取。

监视器图: 自举引导初始监视器需要生成监视器图,为此,需要有 fsid 、集群名(或用默认)、至少一个主机名及其 IP 。

监视器密钥环: 监视器之间通过密钥通讯,所以你必须把监视器密钥加入密钥环,并在自举引导时提供。

管理密钥环: 要使用 ceph 这个命令行工具,你必须有 client.admin 用户,所以你要创建此用户及其密钥,并把他们加入密钥环。

前述必要条件并未提及 Ceph 配置文件的创建,然而,实践中最好创建个配置文件,并写好 fsid 、 mon initial members 和 mon host 配置。

你也可以查看或设置运行时配置。 Ceph 配置文件可以只包含非默认配置, Ceph 配置文件的配置将覆盖默认值,把这些配置保存在配置文件里可简化维护。

具体过程如下:

前期准备

1) 配置主机名和IP
1
2
3
4
5
6

hostnamectl set-hostname vm01;nmcli connection modify ens33 ipv4.address "200.200.200.221/24" ipv4.dns "1.1.1.1 8.8.8.8" ipv4.gateway "200.200.200.1" ipv4.method manual && systemctl restart network

hostnamectl set-hostname vm02; nmcli connection modify ens33 ipv4.address "200.200.200.222/24" ipv4.dns "1.1.1.1 8.8.8.8" ipv4.gateway "200.200.200.1" ipv4.method manual && systemctl restart network

hostnamectl set-hostname vm03; nmcli connection modify ens33 ipv4.address "200.200.200.223/24" ipv4.dns "1.1.1.1 8.8.8.8" ipv4.gateway "200.200.200.1" ipv4.method manual && systemctl restart network
2) 配置安装源,方式一:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

rpm='rpm-luminous'
os='el7'
#url=http://mirrors.aliyun.com/ceph
url=https://download.ceph.com

cat > /etc/yum.repos.d/ceph.repo <<EOF
[ceph]
name=Ceph packages for $basearch
baseurl=${url}/${rpm}/${os}/\$basearch
enabled=1
priority=1
gpgcheck=1
gpgkey=${url}/keys/release.asc

[ceph-noarch]
name=Ceph noarch packages
baseurl=${url}/${rpm}/${os}/noarch
enabled=1
priority=1
gpgcheck=1
gpgkey=${url}/keys/release.asc

[ceph-source]
name=Ceph source packages
baseurl=${url}/${rpm}/${os}/SRPMS
enabled=0
priority=1
gpgcheck=1
gpgkey=${url}/keys/release.asc

EOF
2) 配置安装源,方式二:
1
2
3
4
5
6
7
8
9
10
11
cat > /etc/yum.repos.d/ceph.repo <<EOF
[ceph-noarch]
name=Ceph noarch packages
baseurl=https://download.ceph.com/rpm/el7/x86_64
#baseurl=https://download.ceph.com/rpm-luminous/el7/x86_64/
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

EOF
3) 软件安装
1
2
3
4
5
6
7

yum install ceph -y

# 系统时钟同步
yum install chrony -y
systemctl enable chronyd
systemctl start chronyd
4) 防火墙,selinux,权限
1
2
3
4

## ceph Monitors 之间默认使用 6789 3300 端口通信, OSD 之间默认用 6800:7300 这个范围内的端口通信

firewall-cmd --add-service={ceph,ceph-mon} --permanent && firewall-cmd --reload
selinux 安全相关:

    日志文件上下文为 ceph_log_t,默认路径:/data/ceph/log

    日志文件上下文为 ceph_var_lib_t,默认路径:/data/ceph/log

    ceph 默认用户为ceph, 如果更改其它用户,那么/data/ceph/log /data/ceph/log 目录所有者必须改为ceph,/data/ceph/log权限默认为0750
4)创建ceph用户,在每节点ceph的用户uid gid 和用户名都要一致
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

groupadd ceph.admin --gid 2000

useradd ceph.admin --uid 2000 --gid 2000

# 为ceph.admin设置一个256位的密码,至少包含20个(数字,小写/大写字母,特殊字符)
yum -y install expect
mkpasswd -l 256 -d 20 -c 20 -C 20 -s 20 -v ceph.admin

# 这里用一个32位的密码方便操作
mkpasswd -l 32 -d 4 -c 4 -C 4 -s 4 -v ceph.admin
echo 'i53pwDKquIVwsf^npbzxkt4z}5mit%o!' | passwd --stdin ceph.admin


## 同时需要修改service 文件,更改启动用户名

vi /usr/lib/systemd/system/ceph-mon@.service
ExecStart=/usr/bin/ceph-mon -f --cluster ${CLUSTER} --id %i --setuser ceph.admin --setgroup ceph.admin

vi /usr/lib/systemd/system/ceph-osd@.service
ExecStart=/usr/bin/ceph-osd -f --cluster ${CLUSTER} --id %i --setuser ceph.admin --setgroup ceph.admin

vi /usr/lib/systemd/system/ceph-mds@.service
ExecStart=/usr/bin/ceph-mds -f --cluster ${CLUSTER} --id %i --setuser ceph --setgroup ceph

systemctl daemon-reload

## 使用sed修改启动用户

sed -i "s/--setuser ceph --setgroup ceph/--setuser ceph.admin --setgroup ceph.admin/" /usr/lib/systemd/system/ceph-{mon,mds,osd,mgr}@.service

## 使用sed 修改启动集群名

sed -i "s/Environment=CLUSTER=ceph.*/Environment=CLUSTER=cephfs/" /usr/lib/systemd/system/ceph-{mon,mds,osd,mgr}@.service

## 修改osd存储所有者检查

sed -i "s#if \[ \$owner != 'ceph' -a \$owner \!= 'root' \]; then#if [ \$owner \!= 'ceph' -a \$owner != 'ceph.admin' -a \$owner \!= 'root' ]; then#" /usr/lib/ceph/ceph-osd-prestart.sh

##sed -i "s#data=\"/var/lib/ceph/osd/\$\{cluster\:-ceph\}-\$id\"#data=\"/data/ceph/osd/\$\{cluster\:-ceph\}-\$id\"#" /usr/lib/ceph/ceph-osd-prestart.sh

##data=\"/data/ceph/osd/\$\{cluster\:-ceph\}-\$id\"

#修改目录权限

mkdir -p /data/ceph/{mon,log,osd,mgr}

chown -R ceph.admin:ceph.admin /data/ceph
chown -R ceph.admin:ceph.admin /data/ceph/log
chown -R ceph.admin:ceph.admin /var/run/ceph

yum -y install policycoreutils-python

semanage fcontext -a -t ceph_var_lib_t "/data/ceph(/.*)?"
restorecon -RFv /data/ceph

semanage fcontext -a -t ceph_log_t "/data/ceph/log(/.*)?"
restorecon -RFv /data/ceph/log

semanage fcontext -a -t ceph_var_run_t "/var/run/ceph(/.*)?"
restorecon -RFv /var/run/ceph


## ceph 如果不采用默认用户,centos开机会自动创建/run/ceph目录及所有者,此时需要修改所有者权限,修改如下

vi /usr/lib/tmpfiles.d/ceph-common.conf
d /run/ceph 0770 ceph.admin ceph.admin -


echo 'd /run/ceph 0770 ceph.admin ceph.admin -' > /usr/lib/tmpfiles.d/ceph-common.conf


# 说明下面仍然使用的是ceph默认创建的ceph用户,可以在配置好后启动正常,再修改成ceph.admin运行
5)授权root权限,且无须输入密码
1
2
3
4
5
6
7
8
9
10
11
12
13

echo 'ceph.admin ALL = (ALL) NOPASSWD: ALL' | tee /etc/sudoers.d/ceph
chmod 0440 /etc/sudoers.d/ceph


或者:

echo 'ceph.admin ALL = (ALL) NOPASSWD: ALL' >> /etc/sudoers


或者:这种方式 sudo -i 会提示输入密码, 所以不能用
echo 'ceph.admin ALL = (ALL) ALL' >> /etc/sudoers
echo 'ceph.admin ALL = (root) NOPASSWD: ALL' | tee /etc/sudoers.d/ceph
6) 配置无密钥登陆,切换至ceph.admin用户
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
    
# 分别更改计算机名
sudo hostnamectl set-hostname vm01

cat > ~/.ssh/config <<EOF
Host vm01
Hostname vm01
User ceph.admin
Host vm02
Hostname vm02
User ceph.admin
Host vm03
Hostname vm03
User ceph.admin
EOF

chmod 0600 ~/.ssh/config

sudo cat > /etc/hosts <<EOF
200.200.200.221 vm01
200.200.200.222 vm02
200.200.200.223 vm03
EOF

# 切换至ceph.admin用户,生成公钥以及私钥于当前用户.ssh目录下,id_rs is_rsa.pub
cd ~/.ssh
ssh-keygen -q -t rsa -b 2048 -C "ceph admin key" -P ''

# 将生成的密钥拷贝到各个Ceph节点的ceph.admin用户的 ~/.ssh/目录下
sudo ssh-copy-id -i ~/.ssh/id_rsa.pub ceph.admin@vm01
sudo ssh-copy-id -i ~/.ssh/id_rsa.pub ceph.admin@vm02
sudo ssh-copy-id -i ~/.ssh/id_rsa.pub ceph.admin@vm03

## 或者直接复制现成的
mkdir /home/ceph.admin/.ssh

cat > /home/ceph.admin/.ssh/id_rsa <<EOF
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAtQop88+8WRyg5XrUBycsQ+hyOmEXUjKTbGbVVq8QUxeirXRT
uVXgBi6yN+YBEIUmLc7mnaoHqJvgvBWbrzYOujNSqMSeFbbcgHjPpYXzouOCA+2X
z4YbJ5BwmUrm/mF9M3XAqCOpBdvpfiMc97fYBtdL1uidtay1zw4lxNURme57nuKz
okZxB+IgO98Dtnflonip3kYzJuO/clBUeTWdce8smXlCSXhZuVEKqaf/DCKpUB8b
iAnIYoG3ipebte4vJMzMBkTmz3InRDhSzWDX8//2xv7BzVpDJNq74wz8WNZ5vp7H
tgD7sDqtomtgTGgfaOB64bbDTCx4h0jVKl+srwIDAQABAoIBAFdrRwLCRvLIzjDB
dOzXT5qi/bWO+JHqdiGcLlwjQMC+4wDa8SrHetvBZLF1UQJHKT5pcBal6fjS/FwW
Gw0qD0Z+TeXMu4FEwYkPzUTiP9lh/oAjFHFTEn2yU4zSDGS9cpWMwLDwN0fq/v63
ud8sWRZElAx8WttFQK1w6W/4av1myLWjiq12ZxZjHIvUBGF+7hkkHv/rDFicQLGc
+JSqlOMt7RVrW0NW+mqYzupmctADwJ7LitESVieZ2wKPv7aGyYRP+Odu5UFPkv2i
7fWvUYbGGg9Oj/XKFjKoFID2R8lulzrTowX0ROIB+5xm1J7ekWhI1IkLVRG41BEI
2QXvGnECgYEA57kI6cqRrs8/9tfhVRj89mFeO7RyBxC72rEpn3P1CFa1/GvWVElW
U1EaIhGBELhIh9SPaVBA7DulRuoFTQYALJ7KhIGjplYIn7vYl3mWqZFOfEng4CUc
47jxp+1fjY7yfyjVr1jC8fkQDImnf1wG8+Y4h+qOYfWqU/mahFNd0CUCgYEAyAHG
DCsVdLvTwkY7tepy/nZD/jRcZad0VCXaFPb9O6N1wppz5FHiIt6NxweEYxqKo2lf
9IOv4ski3LMO1bLWgF7w2EKSntg23t+MBFJnesgrvHzSClQLQBfPU+xFaXv4Mnz5
5GaRMO5cuPUm0i+pgQJnQkadIHfF7zZjTz99d0MCgYEA0CdIWXNtUIG9rMiaEu5i
dhRbKPjcIXqntTjF8gWhDD+QNNLN8mL6l9dXyVi9/r378YBA31KHL24Y9s3Luzfz
uiFePI+T6RyJnKuKUe+YJnRv83gN+Gt+OxXshnPWDPxm21FcOqpaXDDmeMzC2MZb
PIcHKxjJlDexLMQgSFP3Br0CgYAG6ljIruys/pmRzA/geFzFg51SOsk/Eo0pI63o
r6mN2FcIBYMgT9x7zComyZHAQ3irsccJk0wPkVjNPLu0k9xqz92P/K1JJLyw9BXJ
SHgffLBWchJpHQLOkoQuqKq1vP2V8VBKn2lBwdwe4QsYlWFM/qJHXl2sc7e6T60b
XlyeNQKBgQDhWxjRHZZkYmi3qNiGLDNSHrNUSdYZWFT5iyqtJBtnay5L3o1VYj3y
JVrTKbjpa0YEiDY5mPWZVpzP9mkUCIjkJUUENcsy7w+I151z5y4oSQZl1Xbok5zr
HxBzKfMQNJ53nlil9zLJkbHqUFj5U44sCrbfLImkH9SCQUQr+qKMWA==
-----END RSA PRIVATE KEY-----
EOF

cat > /home/ceph.admin/.ssh/id_rsa.pub <<EOF
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1Cinzz7xZHKDletQHJyxD6HI6YRdSMpNsZtVWrxBTF6KtdFO5VeAGLrI35gEQhSYtzuadqgeom+C8FZuvNg66M1KoxJ4VttyAeM+lhfOi44ID7ZfPhhsnkHCZSub+YX0zdcCoI6kF2+l+Ixz3t9gG10vW6J21rLXPDiXE1RGZ7nue4rOiRnEH4iA73wO2d+WieKneRjMm479yUFR5NZ1x7yyZeUJJeFm5UQqpp/8MIqlQHxuICchigbeKl5u17i8kzMwGRObPcidEOFLNYNfz//bG/sHNWkMk2rvjDPxY1nm+nse2APuwOq2ia2BMaB9o4HrhtsNMLHiHSNUqX6yv ceph admin key
EOF

cat > /home/ceph.admin/.ssh/authorized_keys <<EOF
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1Cinzz7xZHKDletQHJyxD6HI6YRdSMpNsZtVWrxBTF6KtdFO5VeAGLrI35gEQhSYtzuadqgeom+C8FZuvNg66M1KoxJ4VttyAeM+lhfOi44ID7ZfPhhsnkHCZSub+YX0zdcCoI6kF2+l+Ixz3t9gG10vW6J21rLXPDiXE1RGZ7nue4rOiRnEH4iA73wO2d+WieKneRjMm479yUFR5NZ1x7yyZeUJJeFm5UQqpp/8MIqlQHxuICchigbeKl5u17i8kzMwGRObPcidEOFLNYNfz//bG/sHNWkMk2rvjDPxY1nm+nse2APuwOq2ia2BMaB9o4HrhtsNMLHiHSNUqX6yv ceph admin key
EOF

# .ssh 目录权限0700, .ssh/authorized_keys 文件权限0440, 所有者和组权限都是ceph.admin
sudo chmod 0700 /home/ceph.admin/.ssh
sudo chmod 0600 /home/ceph.admin/.ssh/*
sudo chown -R ceph.admin:ceph.admin /home/ceph.admin/.ssh

修改配置文件

1) 创建/etc/ceph/{cluster name}.conf,最小模板:

    [global]
    fsid = {fsid}
    mon initial members = {hostname}[,{hostname}]
    mon host = {ip}[,{ip}]

    完整示例版:

    # yum 安装的ceph 默认集群名就是ceph。如果集群名为其它,比如cephfs, 那么集群配置文件名必须是cephfs.conf
## 如果集群名为其它(比如cephfs), 那么集群配置文件名必须是cephfs.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165

cat > /etc/ceph/cephfs.conf << EOF

[global]
cluster = cephfs
## 用UUID生成
fsid = a7f64266-0894-4f1e-a635-d0aeaca0e993

public network = 10.100.100.0/24
cluster network = 10.100.100.0/24

auth cluster required = cephx
auth service required = cephx
auth client required = cephx

osd pool default size = 3
osd pool default min size = 2

osd pool default pg num = 128
osd pool default pgp num = 128

## osd pg 数量限制,pool最大pg数量=(osd数量*mon max pg per osd)/osd pool default size/pool count
mon allow pool delete = true
mon max pg per osd = 1024
osd max pg per osd hard ratio = 8

osd journal size = 1024

#osd pool default crush rule = 0
osd crush chooseleaf type = 1

admin socket = /var/run/ceph/\$cluster-\$name.asock
pid file = /var/run/ceph/\$cluster-\$name.pid
log file = /data/ceph/log/\$cluster-\$name.log
log to syslog = false

max open files = 131072

## 网路地址如果使用ipv6 则改为true
ms bind ipv6 = false



[mon]
mon initial members = web01,web02,web03
# 这里可以写IP[:port] 或者能解析的计算机名
mon host = 10.100.100.4:6789,10.100.100.5:6789,10.100.100.6:6789

mon data = /data/ceph/mon/\$cluster-\$name
#mon clock drift allowed = 10
#mon clock drift warn backoff = 30

# 在被OSD进程使用之前一个硬盘的百分比​被认为是充分的。
mon osd full ratio = .95
# 在被OSD进程使用之前一个硬盘的百分比​被认为是近似充分的
mon osd nearfull ratio = .85

#mon osd down out interval = 600
#mon osd report timeout = 300

#debug ms = 20
#debug mon = 20
#debug paxos = 20
#debug auth = 20
#mon allow pool delete = true

[mon.web01]
host = web01
mon addr = 10.100.100.4:6789
[mon.web02]
host = web02
mon addr = 10.100.100.5:6789
[mon.web03]
host = web03
mon addr = 10.100.100.6:6789



[mgr]
mgr data = /data/ceph/mgr/\$cluster-\$name
mgr initial modules = dashboard



[mds]
mds data = /data/ceph/mds/\$cluster-\$name
keyring = /data/ceph/mds/\$cluster-\$name/keyring
[mds.web01]
host = web01
mds standby replay = true
mds standby for rank = 0
[mds.web02]
host = web02
mds standby replay = true
mds standby for rank = 0
[mds.web03]
host = web03
mds standby replay = true
mds standby for rank = 0



[osd]

bluestore = true
bluestore fsck on mount = true
osd objectstore = bluestore
osd data = /data/ceph/osd/\$cluster-\$id
osd journal = /data/ceph/osd/\$cluster-\$id/journal
bluestore block path = /dev/disk/by-partlabel/bluestore_block_\$id
bluestore block db path = /dev/disk/by-partlabel/bluestore_block_db_\$id
bluestore block wal path = /dev/disk/by-partlabel/bluestore_block_wal_\$id

[osd.1]
host = web01
addr = 10.100.100.4
[osd.2]
host = web02
addr = 10.100.100.5
[osd.3]
host = web03
addr = 10.100.100.6

EOF





## osd 其它配置方式

[osd]

#run_dir = /data/ceph/osd/$cluster-$id
osd journal = /data/ceph/osd/$cluster-$id/journal
osd data = /data/ceph/osd/$cluster-$id
osd recovery max active = 3
osd max backfills = 5
osd max scrubs = 2

osd mkfs type = xfs
osd mkfs options xfs = -f -i size=1024
osd mount options xfs = rw,noatime,inode64,logbsize=256k,delaylog

filestore max sync interval = 5
osd op threads = 2

#debug ms = 10
#debug osd = 100

## 如果osd存储磁盘的文件系统是ext4,不是xfs,启动会报错osd init failed (36) File name too long,则添加下面两行
#osd max object name len = 256
#osd max object namespace len = 64

## ext4 系统文件格式必须添加,并且磁盘加载项需要添加user_xattr,如:defaults,user_xattr
#filestore xattr use omap = true
[osd.1]
host = vm01
addr = 200.200.200.221
[osd.2]
host = vm02
addr = 200.200.200.222
[osd.3]
host = vm03
addr = 200.200.200.223
# 客户端keyring配置

    [client.admin]
    keyring = /etc/ceph/ceph.client.admin.keyring

    注意: 你也可以写 IPv6 地址,但是必须设置 ms bind ipv6 = true

添加第一个mon

## 创建mon所需的密钥和目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

## 注意: keyring和conf等文件名必须以<集群名>.开头, 创建的目录也需要以<集群名>.开头

## mon 权限
ceph-authtool --create-keyring /etc/ceph/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'

## ceph集群管理员admin权限
ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --set-uid=0 --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow' --cap mgr 'allow *'

#ceph-authtool --create-keyring /data/ceph/bootstrap-osd/ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd'


## 创建集群密匙文件, 没产生密匙,其实用touch创建也可以
ceph-authtool --create-keyring /etc/ceph/ceph.keyring

## 将密匙导入集群密匙文件中
ceph-authtool /etc/ceph/ceph.keyring --import-keyring /etc/ceph/ceph.mon.keyring
ceph-authtool /etc/ceph/ceph.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring

#ceph-authtool /etc/ceph/ceph.keyring --import-keyring /data/ceph/bootstrap-osd/ceph.keyring

## 创建monmap文件
# 注意,如果这里了的IP地址后面加端口号,ceph.conf ip地址后面也必须加了端口号,否则报warning,导致服务器启动不了mon
monmaptool --create --add vm01 200.200.200.221:6789 --fsid a7f64266-0894-4f1e-a635-d0aeaca0e993 /etc/ceph/monmap
monmaptool --add vm02 200.200.200.222:6789 --fsid a7f64266-0894-4f1e-a635-d0aeaca0e993 /etc/ceph/monmap
monmaptool --add vm03 200.200.200.223:6789 --fsid a7f64266-0894-4f1e-a635-d0aeaca0e993 /etc/ceph/monmap



## 初始化mon
# 在vm01(,vm02,vm03) 虚机上分别执行,注意第三行的权限修改,否则无法启动ceph, ceph默认是使用ceph用户启动
# 此步会自动根据配置文件,创建目录 /data/ceph/mon/ceph-mon.vm01

ceph-mon --cluster ceph --conf /etc/ceph/ceph.conf --mkfs -i vm01 --monmap /etc/ceph/monmap --keyring /etc/ceph/ceph.keyring

## done 表示mon准备好了,upstart表示系统启动时可以自动启动


touch /data/ceph/mon/ceph-mon.vm01/{done,upstart}

chown -R ceph.admin:ceph.admin /data/ceph/mon

systemctl start ceph-mon@vm01



## 查看monmap
monmaptool --print /etc/ceph/monmap

## 查看ceph 状态
## 如果集群名不是ceph, 需要添加--cluster <其它集群名>
ceph -s
ceph -s --cluster cephfs

ceph health detail
ceph health detail --cluster cephfs
# 以下是解释说明:
2)创建 mon keyring:

    ceph-authtool --create-keyring /etc/ceph/{cluster name}.mon.keyring --gen-key -n mon. --cap mon 'allow *'

3)创建administrator keyring:

    ceph-authtool --create-keyring /etc/ceph/{cluster name}.client.admin.keyring --gen-key -n client.admin --set-uid=0 --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow'

4) 把client.admin的key加入mon.keyring:

    ceph-authtool /etc/ceph/{cluster name}.keyring --import-keyring /etc/ceph/{cluster name}.client.admin.keyring

5) 创建monmap:使用hostname、IP、FSID生成一个monitor map

    monmaptool --create --add {hostname} {ip-address} --fsid {uuid} /etc/ceph/monmap

6) 创建mon的数据路径:在monitor主机上创建默认的数据目录

    mkdir /data/ceph/mon/{cluster-name}-{hostname}

7) 初始化mon,提供monmap和keyring给monitor deamon:

    ceph-mon [ --cluster {cluster-name} ] --mkfs -i {hostname} --monmap /etc/ceph/monmap --keyring /etc/ceph/{cluster name}.mon.keyring

8) 配标记monitor配置好了,可以启动

    touch /data/ceph/mon/{cluster-name}-{hostname}/done

9) 修改权限

    chown -R ceph.admin:ceph.admin /data/ceph/mon


10) 启动monitor
    systemctl start ceph-mon@vm01

    如果启动出错,尝试运行下面命令,再重启程序
    systemctl reset-failed ceph-mon@vm01.service

11) 查看集群状态,ceph -s,因为此时还没有OSD,所以集群是HEALTH_ERR状态,pg都是creating状态

添加其他monitor节点

## 从第一个mon节点复制文件到新mon节点

    sudo chown -R ceph.admin /etc/ceph
    scp /etc/ceph/{ceph*,monmap} ceph.admin@web01:/etc/ceph/

需要从第一个节点拷贝4个文件,keyring的文件权限0600:

    /etc/ceph/{cluster-name}.keyring
    /etc/ceph/monmap
    /etc/ceph/{cluster-name}.client.admin.keyring
    /etc/ceph/{cluster-name}.conf 




接下来只需要几步,具体命令参考第一个节点:


    创建mon的数据路径,后面一条命令会自动创建,此命令可以不用执行
        mkdir /data/ceph/mon/ceph-mon.vm02
    提供monmap和keyring给monitor deamon
## 添加mon节点
1
2
3
4
5
6
7
8
9
10

host_name=vm02

ceph-mon --cluster ceph --conf /etc/ceph/ceph.conf --mkfs -i $host_name --monmap /etc/ceph/monmap --keyring /etc/ceph/ceph.mon.keyring

touch /data/ceph/mon/ceph-mon.$host_name/{done,upstart}

chown -R ceph.admin:ceph.admin /data/ceph/mon

systemctl start ceph-mon@$host_name

手动部署osd

## 需要确保 osd 数据盘有读写权限
chown -R ceph.admin:disk /dev/sdc{2,3,4}
## bash 命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

osd_uuid=$(uuidgen)
osd_num=1
cluser_name=cephfs
host_name=web01

ceph osd create --cluster $cluser_name $osd_uuid $osd_num

mkdir /data/ceph/osd/$cluser_name-$osd_num
mkdir /data/ceph/osd/$cluser_name-$osd_num/journal

echo "bluestore" > /data/ceph/osd/$cluser_name-$osd_num/type

ceph-osd --cluster $cluser_name -i $osd_num --mkfs --mkjournal --mkkey --osd-uuid $osd_uuid

ceph auth add --cluster $cluser_name osd.$osd_num osd 'allow *' mon 'allow profile osd' -i /data/ceph/osd/$cluser_name-$osd_num/keyring

ceph --cluster $cluser_name
> osd crush add-bucket $host_name host

> osd crush move $host_name root=default

> osd crush add osd.$osd_num 1.0 host=$host_name


ceph osd tree --cluster $cluser_name


touch /data/ceph/osd/$cluser_name-$osd_num/{done,upstart}

sudo chown -R ceph.admin:ceph.admin /data/ceph/osd

sudo systemctl start ceph-osd@$osd_num
1)产生用于osd 的 uuid, 每个osd都需要一个唯一的uuid
    uuidgen
    270cac2a-359d-4ebd-9713-612f81fb4bb2

2) 调用 ceph osd create 分配OSD编号:ceph osd create {uuid} {osd数字编号}
    ## ceph osd create [{uuid} [{id}]]
    ceph osd create 270cac2a-359d-4ebd-9713-612f81fb4bb2 1 --cluster ceph

3) 调用 ceph-osd -i {osd数字编号} --mkfs --mkkey --osd-uuid {uuid} 初始化OSD目录:

    # 必须先创建对应的目录ceph-osd.1 为{集群名}-{osd.数字编号},这里osd 的id只能用数字不能用字符
    mkdir /data/ceph/osd/ceph-1
    mkdir /data/ceph/osd/ceph-1/journal

    ceph-osd -i 1 --mkfs --mkjournal --mkkey --osd-uuid 270cac2a-359d-4ebd-9713-612f81fb4bb2        

    # 上面的命令会初始化目录,并产生一个授权文件/data/ceph/osd/ceph-osd.1/keyring

4) 添加osd授权

    ceph auth add osd.1 osd 'allow *' mon 'allow profile osd' -i /data/ceph/osd/ceph-1/keyring

    到这里,OSD的准备工作就已经做好了,可以启动OSD了,在启动之前,也可以先初始化一下crush map。

    osd.1 这是虚拟节点,1是{osd数字编号}


5) 添加一个host节点vm01

    #添加一个host节点vm01
    ceph osd crush add-bucket vm01 host  

    # 将vm01移到default下
    ceph osd crush move vm01 root=default

    # 将osd.1以1.0的权重加到vm01中
    ceph osd crush add osd.1 1.0 host=vm01

    # 查看当前OSD Tree
    ceph osd tree

    osd.1添加到vm01,osd.2添加到vm02,osd.3添加到vm03。这么做目的是因为Ceph默认分配的策略是至少有一份数据在其他机器上.

6)修改权限

    #用systemctl启动必须添加空文件sysvinit,否则只能手工启动
    touch /data/ceph/osd/ceph-1/{done,upstart}
    ##touch /data/ceph/osd/ceph-1/sysvinit

    chown -R ceph.admin:ceph.admin /data/ceph/osd


7) 启动osd

    # 启动osd
    ceph-osd -i 1

    #或者如下方式启动

    systemctl start ceph-osd@1

    或手工启动 
    /usr/bin/ceph-osd -i 1 --pid-file /var/run/ceph/osd.1.pid -c /etc/ceph/ceph.conf --cluster ceph --osd-data=/data/ceph/osd/ceph-1 --osd-journal=/data/ceph/osd/ceph-1/journal

    # 查看当前OSD Tree
    ceph osd tree

    # 查看集群状态
    ceph -s


    ## 用systemctl 启动不了osd, 需要修改ceph-osd-prestart.sh,此文件在启动文件里有运行

    ## 查看
    # vi /usr/lib/systemd/system/ceph-osd@.service
    ExecStartPre=/usr/lib/ceph/ceph-osd-prestart.sh --cluster ${CLUSTER} --id %i

    ## 修改,自定义的目录路径和运行用户名
    vi /usr/lib/ceph/ceph-osd-prestart.sh
    ......
    #data="/var/lib/ceph/osd/${cluster:-ceph}-$id"
    data="/data/ceph/osd/${cluster:-ceph}-$id"

    ......
    if [ $owner != 'ceph.admin' -a $owner != 'ceph' -a $owner != 'root' ]; then



6) 分别在vm02 vm03, 执行上述命令,{osd数字编号}要修改

OSD使用ceph-disk初始化

初始化完mon之后,添加OSD只需要几个简单的命令。

使用ceph-disk 初始化硬盘或分区或文件夹:

ceph-disk prepare --cluster {cluster-name} --cluster-uuid {uuid} --fs-type {ext4|xfs|btrfs} {data-path} [{journal-path}]
如:
sudo ceph-disk prepare --cluster ceph --cluster-uuid a7f64266-0894-4f1e-a635-d0aeaca0e993 --fs-type ext4 /dev/sdb

需要注意的是,这里所说的journal-path,实践中发现其实应该填写的是一个block device或者一个文件名,而不是一个文件夹。如果data-path是文件夹,fs-type选项可以忽略。

激活OSD:

ceph-disk activate {data-path} [--activate-key {path}]

其中的参数activate-key是可选的,用来指定/data/ceph/bootstrap-osd/{cluster}.keyring的位置。这个keyring是在ceph-mon mkfs时生成的,所以需要从刚才初始化的mon节点里拷贝过来。

OSD 使用bluestore

## 下面的 osd_data_1/bluestore_block_db_1等,表示 osd 1 的分区,确保label系统中唯一  
## 要想使用识别某类盘,需要使用 --typecode= 参数  

## 清除所有的分区信息
# sgdisk --zap-all /dev/sdb  

## 创建osd data 分区,用于存放keyring等信息文件
# sgdisk --new=1:0:+1GB --change-name=1:osd_data_1 --partition-guid=1:$(uuidgen) --mbrtogpt -- /dev/sdb  

## 创建block db wal
# sgdisk --new=2:0:+1GB --change-name=2:bluestore_block_db_1 --partition-guid=2:$(uuidgen) --mbrtogpt -- /dev/sdb  

# sgdisk --new=3:0:+1GB --change-name=3:bluestore_block_wal_1 --partition-guid=3:$(uuidgen) --mbrtogpt -- /dev/sdb  

# sgdisk --new=4:0:+15GB --change-name=4:bluestore_block_1 --partition-guid=4:$(uuidgen) --mbrtogpt -- /dev/sdb  

## 记得更改磁盘的权限,系统重启会导致权限恢复到默认值,导致无法启动osd

chown -R root:ceph.admin /dev/sdb{1,2,3,4}
或者
chown -R ceph.admin:disk /dev/sdb{1,2,3,4}


为防止系统重启权限恢复默认值:
添加udev规则设置分区权限

# vi /etc/udev/rules.d/20-ceph-osd.rules
KERNEL=="sdb*", SUBSYSTEM=="block", ENV{DEVTYPE}=="partition", OWNER="ceph.admin", GROUP="ceph.admin", MODE="0660"

或者,下面这一条重启不能生效, 必须手动触发udev命令,其中bluestore就是gpt自定义的label
KERNEL=="sd*", SUBSYSTEM=="block", ENV{DEVTYPE}=="partition",PROGRAM=="/usr/bin/udevadm info $devnode | grep ID_PART_ENTRY_NAME", RESULT=="*bluestore*", OWNER="ceph.admin", GROUP="ceph.admin", MODE="0660"

# partx /dev/sdb  
NR   START      END  SECTORS SIZE NAME                  UUID  
1    2048  2099199  2097152   1G osd_data_1            2f568a34-d89c-4c74-a444-602553e35fbf  
2 2099200  4196351  2097152   1G bluestore_block_db_1  5023371f-29e6-4d28-ae4d-f84107c1d368  
3 4196352  6293503  2097152   1G bluestore_block_wal_1 cc6995ae-77fa-4a05-88a3-88389bb31a07  
4 6293504 41943006 35649503  17G bluestore_block_1     ecd23004-d31f-4603-a8dd-b931902c125d  

# ls -l /dev/disk/by-partlabel/ | grep _1  
lrwxrwxrwx. 1 root root 10 Oct 11 08:27 bluestore_block_1 -> ../../sdb4  
lrwxrwxrwx. 1 root root 10 Oct 11 08:27 bluestore_block_db_1 -> ../../sdb2  
lrwxrwxrwx. 1 root root 10 Oct 11 08:27 bluestore_block_wal_1 -> ../../sdb3  
lrwxrwxrwx. 1 root root 10 Oct 11 08:27 osd_data_1 -> ../../sdb1  

# mkfs.xfs /dev/sdb1
# mount /dev/sdb1 /data/ceph/osd/ceph-1

## 注意初始化osd目录前一定要加入此文件,表示初始时使用bluestore
# echo "bluestore" > /data/ceph/osd/ceph-1/type

后面的操作和上面osd设置一样

挂载方式有两种:

1) 配置文件指定:

[osd]

    bluestore                       = true
    osd data                        = /data/ceph/osd/$clust-$id
    bluestore block path            = /dev/disk/by-partlabel/bluestore_block_$id
    bluestore block db path         = /dev/disk/by-partlabel/bluestore_block_db_$id
    bluestore block wal path        = /dev/disk/by-partlabel/bluestore_block_wal_$id

2) osd data 目录下指定软连接  

    # cd /data/ceph/osd/ceph-1
    # ln -sf /dev/disk/by-partlabel/bluestore_block_1 block
    # ln -sf /dev/disk/by-partlabel/bluestore_block_db_1 block.db
    # ln -sf /dev/disk/by-partlabel/bluestore_block_wal_1 block.wal

[osd]

    bluestore                       = true
    osd data                        = /data/ceph/osd/$clust-$id

MDS手动安装

## 添加MDS配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

cat >> /etc/ceph.conf << EOF

[mds]
mds data = /data/ceph/mds/$cluster-$name
keyring = /data/ceph/mds/$cluster-$name/keyring

[mds.vm01]
host = vm01
[mds.vm02]
host = vm02
[mds.vm03]
host = vm03

EOF
## 添加MDS节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14

cluser_name=cephfs

host_name=web01

mkdir -p /data/ceph/mds/$cluser_name-mds.$host_name/

ceph auth get-or-create --cluster $cluser_name mds.$host_name osd 'allow rwx' mds 'allow' mon 'allow profile mds' -o /data/ceph/mds/$cluser_name-mds.$host_name/keyring

ceph auth list --cluster $cluser_name

chown -R ceph.admin:ceph.admin /data/ceph/mds

systemctl restart ceph-mds@$host_name
## 创建cephfs文件系统
1
2
3
4
5
6
7
8
9

cluser_name=cephfs
ceph mds stat --cluster $cluser_name
ceph osd lspools --cluster $cluser_name

ceph osd pool create metadata 128 128 --cluster $cluser_name
ceph osd pool create data 128 128 --cluster $cluser_name

ceph fs new webfs metadata data --cluster $cluser_name
若有使用cephfs,则MDS节点是必要的。

首先从mon节点拷贝/etc/ceph/{cluster-name}.conf 配置文件。

# 实例模板,其中$cluster 为集群名(这里是ceph),$name 为<节点名>.<mds编号>,比如mds.vm01为$name 则 $id 为vm01
[mds]
mds data = /data/ceph/mds/$cluster-$name
keyring = /data/ceph/mds/$cluster-$name/keyring

[mds.vm01]
host = vm01
[mds.vm02]
host = vm02
[mds.vm03]
host = vm03

创建目录
mkdir -p /data/ceph/mds/ceph-mds.vm01/

创建keyring:ceph auth get-or-create mds.{mds-number} mds 'allow ' osd 'allow *' mon 'allow rwx' > /data/ceph/mds/{cluster}-{mds-number}/keyring。

ceph auth get-or-create mds.vm01 osd 'allow rwx' mds 'allow' mon 'allow profile mds' -o /data/ceph/mds/ceph-mds.vm01/keyring

更改权限
chown -R ceph.admin:ceph.admin /data/ceph/mds

开启MDS
systemctl start ceph-mds@vm01

查看状态
ceph mds stat

# 列出集群池 
ceph osd lspools

需要注意的是,此时通过ceph -s是看不到mds相关信息的,ceph mds stat可以看到MDS不是active的状态。需要先创建一个fs,MDS就会被激活。

使用以下命令创建两个pool,一个用来存储fs的文件数据,一个用来存放fs的元数据:ceph osd pool create {pool-name} {pg-number}。   

创建fs:ceph fs new {fs-name} {metadata-pool_name} {data-pool_name}。

此时再看ceph mds stat和ceph -s,就能看到mds为active and up的状态了。



# 先创建一个metadata pool,存放元数据,必须多副本,否则元数据丢了,就无法恢复数据
ceph osd pool create metadata 64 64

# 再创建一个data pool,存放实际数据,最好使用低延时的ssd盘
ceph osd pool create data 64 64

格式:
ceph osd pool create {pool-name} {pg-num} [{pgp-num}] [replicated]  [crush-rule-name] [expected-num-objects]
ceph osd pool create {pool-name} {pg-num}  {pgp-num}  erasure [erasure-code-profile] [crush-rule-name] [expected_num_objects]

# 需要ceph命令创建文件系统testfs,后两参数是metadata和 data的pool
ceph fs new testfs metadata data


# 获取pool 副本数
# ceph osd pool get metadata min_size
# ceph osd pool get metadata size

# 获取PG 在osd上的分布
# ceph pg dump | grep ^1 | awk '{print $1,$2,$15}'
    1.7c 496 [1,3]
    1.7d 517 [3,2]
    1.7e 496 [2,1]
    1.7f 466 [1,2]

mgr 手动安装

## 添加mgr配置
1
2
3
4
5
6
7
8

cat >> /etc/ceph.conf << EOF

[mgr]
mgr data = /data/ceph/mgr/$cluster-$name
mgr initial modules = dashboard

EOF
## 添加mgr节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

cluser_name=cephfs

host_name=web01

mkdir /data/ceph/mgr/$cluser_name-mgr.$host_name/ -p

ceph auth get-or-create --cluster $cluser_name mgr.$host_name mon 'allow profile mgr' osd 'allow *' mds 'allow *' -o /data/ceph/mgr/$cluser_name-mgr.$host_name/keyring

chown -R ceph.admin:ceph.admin /data/ceph/mgr

systemctl restart ceph-mgr@$host_name

ceph mgr module enable dashboard --cluster $cluser_name --force

ceph mgr services --cluster $cluser_name
1) 配置文件添加:

    [mgr]
        mgr data                     = /data/ceph/mgr/$cluster-$name
        mgr initial modules          = dashboard

2) 创建mgr用户,这里权限可能需要修改一下

    # ceph auth get-or-create mgr.vm01 mon 'allow profile mgr' osd 'allow *' mds 'allow *' -o /data/ceph/mgr/ceph-mgr.vm01/keyring

    如果已创建好了的密匙,则可以直接导入密匙
    # ceph-authtool --create-keyring /data/ceph/mgr/ceph-mgr.vm01/keyring --gen-key -n mgr.vm01 --cap mon 'allow profile mgr' --cap osd 'allow *' --cap mds 'allow *'
    # ceph auth import -i /data/ceph/mgr/ceph-mgr.vm01/keyring


# 已有的用户修改权限
    # ceph auth caps mgr.vm01 mon 'allow profile mgr' osd 'allow *' mds 'allow *'

# 删除用户
    # ceph auth del mgr.vm01

3) 导出用户密钥

    # mkdir /data/ceph/mgr/ceph-mgr.vm01
    # ceph auth get mgr.vm01 -o /data/ceph/mgr/ceph-mgr.vm01/keyring

    # chown -R ceph.admin:ceph.admin /data/ceph/mgr

4) 服务器地址和可选端口必须配置为 config-key



    ## 服务器地址新版不需要设置,会自动选定一台mgr地址,多余的当备用机,port 默认端口7000,需要可以修改
    # ceph config-key put mgr/dashboard/server_addr 200.200.200.221

    # ceph config-key put mgr/dashboard/server_port 8888

    ## 启用mgr dashboard模块,先要启动mgr服务,再启用dashboard
    # systemctl start ceph-mgr@vm01
    # ceph mgr module enable dashboard

5) 重启ceph-mgr

    # systemctl restart ceph-mgr@vm01

    需要修改默认启动用户

    # vi /usr/lib/systemd/system/ceph-mgr@.service
    ......
    ExecStart=/usr/bin/ceph-mgr -f --cluster ${CLUSTER} --id %i --setuser ceph.admin --setgroup ceph.admin
    ......

6) 查看模块

    # ceph mgr module ls
    {
        "enabled_modules": [
            "balancer",
            "dashboard",
            "restful",
            "status"
        ],
        "disabled_modules": [
            "influx",
            "localpool",
            "prometheus",
            "selftest",
            "zabbix"
        ]
    }

7) 查看访问地址


    # ceph mgr services
    {
        "dashboard": "http://vm01:7000/"
    }

8) 帮助
    # ceph mgr help
    # ceph tell mgr help

客户端挂载cephfs

# 客户端安装ceph-common
yum install ceph-common

# 使用其他用户挂载

添加一个用户, osd 后面不能加 pool=testfs,否则没写入权限
如果后面用户权限更改了,需要重新加载

# ceph auth add client.john mon 'allow r' osd 'allow rwx' mds 'allow'

在服务器上,列出授权用户

# ceph auth list
client.john
key: AQBie8NZNjGQOBAAagXYD3fSrTwX+sTc+aVjYQ==
caps: [mds] allow
caps: [mon] allow r
caps: [osd] allow rwx

把密钥存入文档

# vi /etc/ceph/john.key
AQBie8NZNjGQOBAAagXYD3fSrTwX+sTc+aVjYQ==

chmod 0600 /etc/ceph/john.key
mkdir -p /mnt/cephfs
# 强制卸载挂载
# umount -fl /mnt/cephfs



# fstab 加载格式:
{ipaddress}:{port}:/ {mount}/{mountpoint} {filesystem-name}     [name=username,secret=secretkey|secretfile=/path/to/secretfile],[{mount.options}]

10.100.100.4:6789,10.100.100.5:6789,10.100.100.6:6789:/     /mnt/cephfs    ceph    name=john,secretfile=/etc/ceph/john.key,noatime,_netdev    0       0


# 语法:mount -t ceph mds_node1:6789,mds_node2:6789,mds_node3:6789:/ client_mount_path -o name=admin,secret=Key_value 

删除osd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

osd_num=1
cluser_name=cephfs
host_name=web01

ceph osd out osd.$osd_num --cluster $cluser_name

ceph -w --cluster $cluser_name

systemctl stop ceph-osd@$osd_num

ceph osd crush remove osd.$osd_num --cluster $cluser_name
ceph osd crush remove $host_name --cluster $cluser_name
ceph auth del osd.$osd_num --cluster $cluser_name
ceph osd rm $osd_num --cluster $cluser_name

多MDS变成单MDS的方法
设置最大mds

多活的mds的max_mds会超过1,这里需要先将max_mds设置为1

ceph mds set max_mds 1

deactive mds

ceph mds deactivate 1

重设ceph fs, 先要停止左右的ceph-mds实例

ceph mds fail vm01

systemctl stop ceph-mds@vm01

ceph fs reset datafs –yes-i-really-mean-it

ceph fs status datafs

设置mds期望待机备用数量

ceph fs set datafs standby_count_wanted 1

故障切换的管理¶

如果一个 MDS 守护进程不再与监视器通讯,监视器把它标记为 laggy (滞后)状态前会等待 mds_beacon_grace 秒(默认是 15 秒)。

为安全起见,每个文件系统都要指定一些灾备守护进程,灾备数量包括处于灾备重放状态、等着接替失效 rank 的(记着,灾备重放守护进程不会被重分配去接管另一个 rank 、或者另一个 CephFS 文件系统内的失效守护进程)。不在重放状态的灾备守护进程会被任意文件系统当作自己的灾备。每个文件系统都可以单独配置期望的灾备守护进程数量,用这个:

ceph fs set standby_count_wanted

count 设置为 0 表示禁用健康检查。

术语¶

一个 Ceph 集群内可以没有、或者有多个 CephFS 文件系统。 CephFS 文件系统有一个人类可读的名字(用 fs new 设置)、和一个整数 ID ,这个 ID 称为文件系统集群 ID 或 FSCID 。

每个 CephFS 都有几个 rank ,默认是一个,从 0 起。一个 rank 可看作是一个元数据分片。文件系统 rank 数量的控制在 多活 MDS 守护进程的配置 里详述。

CephFS 的每个 ceph-mds 进程(一个守护进程)刚启动时都没有 rank ,它由监视器集群分配。一个守护进程一次只能占据一个 rank ,只有在 ceph-mds 守护进程停止的时候才会释放 rank 。

如果某个 rank 没有依附一个守护进程,那这个 rank 就失效了( failed )。分配给守护进程的 rank 才被当作正常的( up )。

首次配置守护进程时,管理员需分配静态的名字,一般配置都会用守护进程所在的主机名作为其守护进程名字。

守护进程每次启动时,还会被分配一个 GID ,对于这个守护进程的特定进程的生命周期来说它是唯一的。 GID 是整数。

Todo

译者注: rank 翻译为“席位”、“座席”?它们共同处理元数据,且动态分配,类似客服中心的座席。
MDS 守护进程的引用¶

针对 MDS 守护进程的大多数管理命令都接受一个灵活的参数格式,它可以包含 rank 、 GID 或名字。

使用 rank 时,它前面可以加文件系统的名字或 ID ,也可以不加。如果某个守护进程是灾备的(即当前还没给它分配 rank ),那就只能通过 GID 或名字引用。

例如,假设我们有一个 MDS 守护进程,名为 myhost ,其 GID 为 5446 ,分配的 rank 是 0 ,它位于名为 myfs 的文件系统内,文件系统的 FSCID 是 3 ,那么,下面的几种形式都适用于 fail 命令:

ceph mds fail 5446 # GID
ceph mds fail myhost # Daemon name
ceph mds fail 0 # Unqualified rank
ceph mds fail 3:0 # FSCID and rank
ceph mds fail myfs:0 # Filesystem name and rank

故障切换的管理¶

如果一个 MDS 守护进程不再与监视器通讯,监视器把它标记为 laggy (滞后)状态前会等待 mds_beacon_grace 秒(默认是 15 秒)。

为安全起见,每个文件系统都要指定一些灾备守护进程,灾备数量包括处于灾备重放状态、等着接替失效 rank 的(记着,灾备重放守护进程不会被重分配去接管另一个 rank 、或者另一个 CephFS 文件系统内的失效守护进程)。不在重放状态的灾备守护进程会被任意文件系统当作自己的灾备。每个文件系统都可以单独配置期望的灾备守护进程数量,用这个:

ceph fs set standby_count_wanted

count 设置为 0 表示禁用健康检查。
灾备守护进程的配置¶

共有四个选项,用于控制守护进程处于灾备状态时如何工作:

mds_standby_for_name
mds_standby_for_rank
mds_standby_for_fscid
mds_standby_replay

这些配置可写入 MDS 守护进程所在主机(而非监视器上)的 ceph.conf 配置文件。守护进程会在启动时加载这些配置,并发送给监视器。

默认情况下,如果这些选项一个也没配置,那么没领到 rank 的所有 MDS 守护进程都会作为任意 rank 的灾备。

这些配置虽说可以把灾备守护进程关联到特定的名字或 rank ,然而并不能保证这个守护进程只用于那个 rank 。也就是说,有好几个灾备可用时,会用关联的守护进程。假如一个 rank 失效了,而且有一个可用的灾备,那么即使此灾备已关联了另外的 rank 或守护进程名,它仍然会被用掉。
mds_standby_replay¶

如果此选项设置为 true ,灾备守护进程就会持续读取某个处于 up 状态的 rank 的元数据日志。这样它就有元数据的热缓存,在负责这个 rank 的守护进程失效时,可加速故障切换。

一个正常运行的 rank 只能有一个灾备重放守护进程( standby replay daemon ),如果两个守护进程都设置成了灾备重放状态,那么其中任意一个会取胜,另一个会变为普通的、非重放灾备状态。

一旦某个守护进程进入灾备重放状态,它就只能为它那个 rank 提供灾备。如果有另外一个 rank 失效了,即使没有灾备可用,这个灾备重放守护进程也不会去顶替那个失效的。

历史问题:在 v10.2.1 版之前的 Ceph 中,只要设置了 mds_standby_for_* ,这个选项(设置为 false 时)就始终为 true 。
mds_standby_for_name¶

设置此选项可使灾备守护进程只接替与此名字相同的 rank 。
mds_standby_for_rank¶

设置此选项可使灾备守护进程只接替指定的 rank ,如果有其它 rank 失效了,此守护进程不会去顶替它。

你有多个文件系统时,可联合使用 mds_standby_for_fscid 选项来指定想为哪个文件系统的 rank 提供灾备。
mds_standby_for_fscid¶

如果设置了 mds_standby_for_rank ,那么这里可把它限定为是哪个文件系统的 rank 。

如果没设置 mds_standby_for_rank ,那么设置 FSCID 后,这个守护进程可用于此 FSCID 所相关的任意 rank 。当你想让某一守护进程可作任意 rank 的灾备、但仅限于某个特定文件系统时,可用此选项实现。
mon_force_standby_active¶

这些选项用于监视器主机,默认值为 true 。

如果设置为 false ,那么配置为 standby_replay=true 的灾备守护进程只会顶替它们负责的 rank 或指定名字。反之,如果这里设置为 true ,那么配置为 standby_replay=true 的灾备守护进程有可能被分配其它 rank 。
实例¶

这些是 ceph.conf 配置实例。实践中,你可以让所有服务器上的所有守护进程都使用相同的配置文件,也可以让各服务器上的配置文件各不相同,其中只包含它的其守护进程相关的配置。
简单的一对¶

两个 MDS 守护进程 a 和 b 作为一对,其中任意一个没分到 rank 的将作为另一个的灾备重放追随者。

[mds.a]
mds standby replay = true
mds standby for rank = 0

[mds.b]
mds standby replay = true
mds standby for rank = 0

浮动灾备¶

某一文件系统有三个 MDS 守护进程: a 、 b 、 c ,其 max_mds 为 2 。

无须过多配置,没有分到 rank 的守护进程会成为灾备,它会顶

替任何一个失效的守护进程。

两个 MDS 集群¶

有两个文件系统、四个 MDS 守护进程,我想让其中两个作为一对服务于一个文件系统,另外两个作为一对服务于另一个文件系统。

[mds.a]
mds standby for fscid = 1

[mds.b]
mds standby for fscid = 1

[mds.c]
mds standby for fscid = 2

[mds.d]
mds standby for fscid = 2

客户端配置参考¶

client acl type
描述: 设置 ACL 类型。现在还只能设置为 “posix_acl” 表示启用 POSIX ACL ,或者可设置为空字符串。此选项只有在 fuse_default_permissions 被设置为 false 时有效。
类型: String
默认值: “” (no ACL enforcement)

client cache mid
描述: 设置客户端缓存中点。此中点把最近用过的列表分割为热列表和暖列表。
类型: Float
默认值: 0.75

client_cache_size
描述: 设置客户端可保留在元数据缓存中的索引节点数量。
类型: Integer
默认值: 16384

client_caps_release_delay
描述: 设置释放能力的延时,单位为秒。这个延时控制着客户端不再需要能力时,再等多少秒就释放,以便其它需要这些能力的用户使用。
类型: Integer
默认值: 5 (seconds)

client_debug_force_sync_read
描述: 设置为 true 时,客户端会跳过本地页缓存、直接从 OSD 读取数据。
类型: Boolean
默认值: false

client_dirsize_rbytes
描述: 设置为 true 时,就采用目录的递归尺寸(也就是其内所有文件尺寸之和)。
类型: Boolean
默认值: true

client_max_inline_size
描述: 控制内联数据的最大尺寸,小于此尺寸就存储到文件的索引节点内,超过则存到单独的 RADOS 对象内。本选项只有设置了 MDS 图的 inline_data 标志时有效。
类型: Integer
默认值: 4096

client_metadata
描述: 客户端向各 MDS 发送元数据时,除了自动生成的版本号、主机名等信息,还可以附加逗号分隔的字符串作为附加元数据。
类型: String
默认值: “” (没有附加元数据)

client_mount_gid
描述: 设置 CephFS 挂载后的组 ID 。
类型: Integer
默认值: -1

client_mount_timeout
描述: 设置挂载 CephFS 时的超时时间,单位为秒。
类型: Float
默认值: 300.0

client_mount_uid
描述: 设置 CephFS 挂载后的用户 ID 。
类型: Integer
默认值: -1

client_mountpoint
描述: 指定要挂载的 CephFS 文件系统目录。此选项的作用类似 ceph-fuse 命令的 -r 选项。
类型: String
默认值: “/“

client_oc
描述: Enable object caching.
类型: Boolean
默认值: true

client_oc_max_dirty
描述: 设置对象缓存的脏数据上限,单位为字节。
类型: Integer
默认值: 104857600 (100MB)

client_oc_max_dirty_age
描述: 设置脏数据在对象缓存中的最大存留时间,单位为秒。
类型: Float
默认值: 5.0 (秒)

client_oc_max_objects
描述: 设置对象缓存允许的最大对象数。
类型: Integer
默认值: 1000

client_oc_size
描述: 设置客户端可缓存的数据上限,单位为字节。
类型: Integer
默认值: 209715200 (200 MB)

client_oc_target_dirty
描述: 设置认定为脏数据的目标尺寸。我们建议这个数字尽量小些。
类型: Integer
默认值: 8388608 (8MB)

client_permissions
描述: 检查所有 I/O 操作的客户端权限。
类型: Boolean
默认值: true

client_quota
描述: 设置为 true 表示启用客户端配额。
类型: Boolean
默认值: true

client_quota_df
描述: 让 statfs 操作报告根目录的配额。
类型: Boolean
默认值: true

client_readahead_max_bytes
描述: 设置内核预读数据的最大尺寸,单位为字节。本选项可被 client_readahead_max_periods 覆盖。
类型: Integer
默认值: 0 (unlimited)

client_readahead_max_periods
描述: 设置内核预读的文件布局分片最大数量(对象尺寸 * 条带数量)。本选项会覆盖 client_readahead_max_bytes 选项。
类型: Integer
默认值: 4

client_readahead_min
描述: 设置内核预读的最小尺寸,单位为字节。
类型: Integer
默认值: 131072 (128KB)

client_reconnect_stale
描述: 是否自动重连过期的会话。
类型: Boolean
默认值: false

client_snapdir
描述: 设置快照目录名。
类型: String
默认值: “.snap”

client_tick_interval
描述: 设置更新能力及维持其它信息的间隔时长,单位为秒。
类型: Float
默认值: 1.0 (秒)

client_use_random_mds
描述: 为各个请求随机选取 MDS 。
类型: Boolean
默认值: false

fuse_default_permissions
描述: 设置为 false 时, ceph-fuse 工具会用自己的权限验证机制,而非依靠 FUSE 的强制权限。启用 POSIX ACL 需把此选项设置为 false 、同时设置 client acl type=posix_acl 。
类型: Boolean
默认值: true
开发者选项¶

Important

以下选项仅供内部测试,只是为了保持文档完整才罗列在这里。

client_debug_getattr_caps
描述: 检查 MDS 的响应是否有必要的能力。
类型: Boolean
默认值: false

client_debug_inject_tick_delay
描述: 在客户端动作之间人为地加入延时。
类型: Integer
默认值: 0

client_inject_fixed_oldest_tid
描述:
类型: Boolean
默认值: false

client_inject_release_failure
描述:
类型: Boolean
默认值: false

client_trace
描述: 所有文件操作的追踪文件的路径。其输出可用于 Ceph 的人造客户端。
类型: String
默认值: “” (disabled)

https://drunkard.github.io/cephfs/client-config-ref/

参考:

http://caitianxiong.com/2017/02/25/deploy-ceph-cluster-manually/#more

https://lotuslab.org/2017/03/11/Ceph_manual_deploy_guide.html

http://docs.ceph.org.cn/install/manual-deployment/

http://www.cnblogs.com/boshen-hzb/p/6927407.html

手动添加ceph的mds

1、在需要安装的目标机器上创建mds目录

mkdir -p /data/ceph/mds/ceph-0

2、生成mds的keyring,并将其写入/data/ceph/mds/ceph-0/keyring文件中

ceph auth get-or-create mds.0 mon ‘allow rwx’ osd ‘allow *’ mds ‘allow’ -o /data/ceph/mds/ceph-0/keyring

上面红色部分不能写成allow *,要不然会报错。

3、

apt-get install ceph-mds
ceph-mds –cluster ceph -i 0 -m 10.111.131.125:6789

4、创建文件系统

ceph osd pool create cephfs_data 100
ceph osd pool create cephfs_metadata 100
ceph fs new cephfs cephfs_metadata cephfs_data

How-to quickly deploy a MDS server.

Assuming that /data/ceph/mds/mds is the mds data point.

Edit ceph.conf and add a MDS section like so:

[mds]
mds data = /data/ceph/mds/mds.$id
keyring = /data/ceph/mds/mds.$id/mds.$id.keyring

[mds.0]
host = {hostname}

Create the authentication key (only if you use cephX):

$ sudo mkdir /data/ceph/mds/mds.0
$ sudo ceph auth get-or-create mds.0 mds ‘allow ‘ osd ‘allow *’ mon ‘allow rwx’ > /data/ceph/mds/mds.0/mds.0.keyring

https://my.oschina.net/itfanr/blog/397044
修改/etc/ceph/ceph.conf文件:

[global]
auth supported = none
osd pool default size = 2
osd crush chooseleaf type = 0
objecter_inflight_op_bytes=4294967296
objecter_inflight_ops=1024

#debug filestore = 100
#debug osd = 10
debug journal = 1
filestore blackhole=false
filestore queue max ops=1024
filestore queue max bytes=1073741824
filestore max sync interval=5


#osd op num threads per shard=1
#osd op num shards=1
filestore wbthrottle enable=false
filestore merge threshold=50
filestore split multiple=10
#osd objectstore=satafilestore

[mon]
[mon.0]
host = itfanr-host1
mon addr = 192.168.100.14:6789

[mds]
[mds.0]
host = itfanr-host1

[osd]
osd mkfs type = xfs
osd mkfs options xfs = -f -i size=2048
osd mount options xfs = inode64,noatime

osd crush update on start = 0

[osd.0]
host = itfanr-host1
devs = /dev/sdb1
osd journal = /dev/sdb2

[osd.1]
host = itfanr-host1
devs = /dev/sdc1
osd journal = /dev/sdc2

[osd.2]
host = itfanr-host1
devs = /dev/sdd1
osd journal = /dev/sdd2

[osd.3]
host = itfanr-host1
devs = /dev/sde1
osd journal = /dev/sde2